#coding:utf-8

import sys,os,json,types,re,time
from time import sleep
from CollectSpider.globalvar.globalvar import time_list
from CollectSpider.config.config import URL_LIST
from CollectSpider.service.task import  init_engine,update_status,every_day,update_schedule_flag
from scrapy.spider import BaseSpider as Spider   
from scrapy.crawler import CrawlerProcess
from scrapy.conf import  settings

#获取爬虫的列表
def get_spider_list():
    process=CrawlerProcess(settings)
    spider_loader=process.spider_loader
    return spider_loader.list()
      
    

#根据任务得到 开始路径 对应的爬虫名称
def get_key(urldict,start_url):
    if urldict is None and type(urldict)==types.DictType:
        raise ValueError("params error")
    else:
        key = urldict.keys()
        value = urldict.values()
        return key[value.index(start_url)]

#运行爬虫
def run_spider(spider,task):
    if spider is None and not isinstance(spider,Spider):
        raise ValueError("params error")
    else:
        try:
            process=CrawlerProcess(settings)
            process.crawl(spider,**dict(task))
            
            process.start()
        except Exception,e:
            #异常处理
            print e
        
        
#爬虫调度   
def spider_dispatch(task):
    if task is None and type(task)==types.DictType:
        raise ValueError("params error")
    else:
                #修改任务状态
        update_status(task,**dict({"pid":os.getpid()}))
        #同步数据库中 的任务状态
        task["task_status"]=1
        
        start_url=task["url_start"]
        #根据键得到值
        spider_name=get_key(URL_LIST, start_url)
        #检查任务类型 1 问答  2 是新闻
        task_type=int(task["task_type"]) #获取任务类型
        search_key=task["search_key"] #获取关键字
        # 新闻类型
        if task_type==2:
            if spider_name=='google_spider':
                task["url_start"]=re.sub('q=(\w+)',"q="+search_key,start_url) #构造百度 搜索路径
            elif spider_name=='baidu_spider':
                task["url_start"]=re.sub('word=(\w+)',"word="+search_key,start_url) #构造google搜做的路径
        
        #运行爬虫
        #print task        
        run_spider(spider_name,task)
        
        
def dispatch():
    try:
        params=sys.argv[1]
        print "进入控制中心",params.encode("utf8")
        task=json.loads(params.encode("utf8"))
        
        #根据开始路径，调度爬虫
        #如果是定天运行，就等待执行
        #类型为2  定天运行
        if(int(task["schedule_type"])==2):
            #获取该类型可用的时间,并初始化全局的  可用时间列表,必须的
            every_day(task["id"])
            
            if time_list is not None:
                #定天执行spider
                time=time_list[0]
                nowtime=int(time.time())
                #当前时间跟设定时间,的差值范围
                if nowtime-time>=0:
                    spider_dispatch(task)
                    #更改状态，为执行过
                    update_schedule_flag(task, time)
                    #任务启动时间超过了当前时间,不予执行
                elif nowtime-time<0:
                    print "任务id:%s,调度方式为 2 没有可以允许的时间点，时间超时,或执行过,请知晓" % task["id"]
                else:
                    print "任务id:%s ,执行时间还没到，不予执行" % task["id"]
                    
                            #
            else:
                print "任务id:%s,调度方式为 2 没有可以允许的时间点,请知晓" % task["id"]

        #类型为1  及时运行
        elif(int(task["schedule_type"])==1):
            #代表重复执行,的时间间隔，不标记 -1
            if int(task["time_interval"])>0:
                #重复执行间隔的时间
                sleep(int(task["time_interval"]))
                spider_dispatch(task)
            #代表执行单次，执行之后标记为 -1
            elif int(task["time_interval"])==0:
                spider_dispatch(task)
            else:
                print "任务id:%s 调度方式为1 定时 任务 已经过时，不予执行" % task["id"]
        
        exit(0)
    except Exception,e:
        print e
        exit(2)#参数有问题，没传过来
        
if __name__=="__main__":
    
    init_engine()  
    dispatch()

